import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @ProjectName: ybxy6
 * @Titile: StreamDemo
 * @Author: zqsfg
 * @Description: TODO
 */
public class StreamDemo {
    public static void main(String[] args) {
        List<String> names =new ArrayList<>();
        names.add("张三");
        names.add("李四");
        names.add("王五");
        names.add("赵六");
        names.add("张三1");
        names.add("张三2");
        names.add("张三3");
        names.add("张三4");
        names.add("李四1");
        names.add("王五1");
        names.add("赵六1");


        List<String> list =new ArrayList<>();
        //遍历names集合
        names.forEach(name->{
            //判断集合中的元素是否以张开头
            if(name.startsWith("张")) {
                list.add(name);
            }
        });
        System.out.println(list);


        List<String> list1 =new ArrayList<>();
        list.forEach(name->{
            //判断集合中的元素是否是3个字符
            if(name.length()==3) {
                list1.add(name);
            }
        });
        System.out.println(list1);

        System.out.println("-------------");
        //使用stream流
        //1.获取集合的流对象sream流
        //2.对集合进行过滤操作
        //lambda表达式: s->s.startsWith("张")判断集合中的元素是否以张开头；
        // s->s.length()==3判断集合中的元素是否是3个字符
        //3.终结方法forEach
        names.stream()
                .filter(s -> s.startsWith("张"))
                .filter(s -> s.length()==3)
                .forEach(System.out::println);
    }
    @Test
    public  void test1() {
        //strem流中不能直接修改集合中的元素
        List<Integer> list =new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
        list.add(8);
        list.add(9);
        list.add(10);
        //1.
        //最后调用收集方法，将流中的元素收集到一个新的集合中
        List<Integer> collect = list.stream()
                .filter(i -> i % 2 == 0)
                .collect(Collectors.toList());
        //2.
        List<Integer> collect1 = list.stream()
                .filter(i -> i % 2 == 0)
                .toList();
        System.out.println(collect1);
        System.out.println(collect);
        System.out.println(list);
    }
    @Test
    public void test2(){
        List<String>list=new ArrayList<>();
        list.add("zhangsan,23");
        list.add("lisi,24");
        list.add("wangwu,25");
        //过滤年龄大于等于24岁的
        Map<Object, Object> map=list.stream().filter(s -> {
            //将s切分开
            String[] split = s.split(",");
            //拿到年龄（转成int）
            int age= Integer.parseInt(split[1]);
            return age>=24;
        }).collect(Collectors.toMap(s -> {
            String[] split = s.split(",");
            return split[0];
        }, s -> {
            String[] split = s.split(",");
            return split[1];
        }));
        map.forEach((k,v)->{
            System.out.println(k+"--"+v);
        });


    }
    //流的合并
    @Test
    public void test3(){
        //男演员要3个字的前两个人
        //女演员要姓杨的第二个
        //创建两个流
        //男演员
        List<String> list1=new ArrayList<>();
        list1.add("张新成");
        list1.add("邓超");
        list1.add("黄渤");
        list1.add("张凌赫");
        list1.add("宋威龙");
        //女演员
        List<String> list2=new ArrayList<>();
        list2.add("田曦薇");
        list2.add("赵丽颖");
        list2.add("杨幂");
        list2.add("杨紫");
        list2.add("倪妮");

        //男演员
        Stream<String> stream = list1.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length() == 3;
            }
        }).limit(2);

        //女演员
        Stream<String> stream1 = list2.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.startsWith("杨");
            }
        }).skip(1);
        //合并流
        Stream.concat(stream,stream1).forEach(System.out::println);


    }

}
